/**
 * @Copyright：<a href="http://www.wisesoft.net.cn">四川川大智胜系统集成有限公司</a>
 * @Author: <a href="mailto:fxsen@foxmail.com">Fxsen</a>
 * @CreateTime: 2022年08月11日  11:01
 */
package com.fxsen.commons.utils;

import com.fxsen.commons.core.base.common.Page;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
 *@Author: <a href="mailto:fxsen@foxmail.com">Fxsen</a>
 *@CreateTime: 2022年08月11日  11:01
 */
public class BeanDtoVoUtils<V, E> {
    /**
     * dot ,Do ,entity 相互转换
     * 同：BeanUtils.copyProperties(dtoEntity, newInstance);
     * @author: <a href="mailto:fxsen@foxmail.com">Fxsen</a>
     * @date: 2022/8/11 11:03
 	 * @param: oldClass 原数据--Dto，Vo，entity
 	 * @param: newClass 转换为--Dto，Vo，entity
 	 * @return: {@link E}
    **/
    public static <E> E convert(Object oldClass, Class<E> newClass) {
        // 判断oldClass 是否为空!
        if (oldClass == null) {
            return null;
        }
        // 判断newClass 是否为空
        if (newClass == null) {
            return null;
        }
        try {
            // 创建新的对象实例
            E newInstance = newClass.newInstance();
            // 把原对象数据拷贝到新的对象
            org.springframework.beans.BeanUtils.copyProperties(oldClass, newInstance);
            // 返回新对象
            return newInstance;
        } catch (Exception e) {
            return null;
        }
    }
    //TODO  Page<Entity> 分页对象转 Page<Vo>  ( list 循环)
    public static <T, V> Page<V> pageVo(Page<T> page, Class<V> v) {
        try {
            List<T> tList = page.getRecords();
            List<V> voList = new ArrayList<>();
            for (T t : tList) {
                V newv = (V) convert(t, v.newInstance().getClass());
                voList.add(newv);
            }
            return new Page<V>(page.getPageNo(),page.getPageSize(), (int) page.getTotalCount(),voList);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    //TODO  Page<Entity> 分页对象转 Page<Vo> （Stream 方式）
    public static  <T, V> Page<V> pageVoStream(Page<T> page, Class<V> v) {
        List<V> voList = page.getRecords().stream().map(item -> {
            try {
                return (V) BeanDtoVoUtils.convert(item, v.newInstance().getClass());
            } catch (InstantiationException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return null;
        }).collect(Collectors.toList());
        return new Page<V>(page.getPageNo(),page.getPageSize(), (int) page.getTotalCount(),voList);
    }
    //TODO  Page<Entity> 分页对象转 Page<Vo>  ( list 循环)
    public static <T, V> Page<V> pageConvert(Page<T> page, Class<V> v) {
        return (Page<V>) page.convert(item -> {
            try {
                V newv = (V) convert(item, v.newInstance().getClass());
                return newv;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        });
    }

}
